/*******************************************************************************
 * Copyright (c) 2011-11-10 @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a>.
 * All rights reserved.
 *
 * Contributors:
 *     <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> - initial API and implementation
 ******************************************************************************/
package com.redhat.auth.ejb;

import java.util.List;

import com.dayatang.querychannel.support.Page;
import com.redhat.auth.ejb.vo.AccountVO;
import com.redhat.auth.ejb.vo.BizSystemVO;
import com.redhat.auth.ejb.vo.RoleVO;

/**
 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 
 * @since 2011-11-10
 */
public interface AccountApplication {

	/**
	 * 删除一个帐户，在生产中请勿使用该接口
	 * @param id
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 
	 * @since 2011-11-15
	 */
	void deleteAccount(Long id);

	/**
	 * 新增或修改一个account实体
	 * @param account {email,realName,description}
	 */
	AccountVO update(AccountVO account);

	/**
	 * 新增一个account实体
	 * @param account
	 */
	AccountVO add(AccountVO account);

	/**
	 * 锁定一个帐号
	 * @param account
	 */
	void lock(Long accountId);

	/**
	 * 解锁一个帐号
	 * @param account
	 */
	void unLock(Long accountId);

	/**
	 * 通过ID获取帐户信息
	 * @param id
	 * @return
	 */
	AccountVO getAccount(long id);

	/**
	 * 通过用户名来获取帐户信息
	 * @param username
	 * @return
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 
	 * @since 2011-11-15
	 */
	AccountVO getAccount(String username);

	/**
	 * 根据名称查询帐号是否存在
	 * @param username
	 * @return
	 */
	boolean isAccountExistsByName(String username);

	/**
	 * 根据帐号Email查询帐号是否存在
	 * @param email
	 * @return
	 */
	boolean isAccountExistsByEmail(String email);

	/**
	 * 将一个帐号同多个系统绑定起来
	 * @param accountId
	 * @param systemIds
	 * @return
	 */
	void accountBindSystems(long accountId, String[] systemIds);

	/**
	 * 将一个帐号同多个系统解除绑定
	 * @param accountId
	 * @param systemIds
	 */
	void accountUnBindSystem(long accountId, String[] systemIds);

	/**
	 * 设置一个帐号和一个系统的绑定状态
	 * @param accontId
	 * @param systemId
	 * @param status
	 */
	void setBizSystemBindingStatus(long accontId, long systemId,
			int bizSystemBindingStatus);

	/**
	 * 将一个系统同多个帐号进行绑定
	 * @param systemId
	 * @param accountIds
	 */
	void systemBindAccount(long systemId, String[] accountIds);

	/**
	 * 解除一个系统同多个帐号之间的绑定
	 * @param systemId
	 * @param accountIds
	 */
	void systemUnBindAccount(long systemId, String[] accountIds);

	/**
	 * 查出所有的accounts
	 * @param search {username, realName}
	 * @param page
	 * @param pageSize
	 * @return
	 */
	List<AccountVO> listAcounts(AccountVO search, int page, int pageSize);

	/**
	 * 根据一个系统ID联动的查询出相应的Account
	 * @param search {id=bizSystemId, username, realName}
	 * @param page
	 * @param pageSize
	 * @return
	 */
	List<AccountVO> listAccountBySystemId(AccountVO search, int page,
			int pageSize);

	/**
	 * 获取一个系统，查询出所有未包含此系统的Account
	 * @param search {username, realName}
	 * @param page
	 * @param pageSize
	 * @return
	 */
	List<AccountVO> listAccountNotContainsSystemId(AccountVO search, int page,
			int pageSize);

	/**
	 * 传入accountId时，返回所有此ID未绑定的BizSystem
	 * @param search {id}
	 */
	List<BizSystemVO> listBizSystemNotBindingAccount(AccountVO search,
			int page, int pageSize);

	/**
	 * 为指定ID的帐户设置其角色
	 * @param accountId
	 * @param roleIds
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 
	 * @since 2011-11-15
	 */
	void setRoles(Long accountId, Long[] roleIds);

	/**
	 * 为指定ID的帐户添加角色
	 * @param accountId
	 * @param roleIds
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 
	 * @since 2011-11-15
	 */
	void addRole(Long accountId, Long[] roleIds);

	/**
	 * 为指定ID的帐户删除角色
	 * @param accountId
	 * @param roleIds
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 
	 * @since 2011-11-15
	 */
	void removeRole(Long accountId, Long[] roleIds);

	/**
	 * 分页查询帐户信息
	 * @param vo {username, realName}
	 * @param page
	 * @param pageSize
	 * @return
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 
	 * @since 2011-11-16
	 */
	Page<AccountVO> pageQueryAccount(AccountVO vo, int page, int pageSize);

	/**
	 * 查找帐户信息
	 * @param vo {username, realName}
	 * @return
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 
	 * @since 2011-11-16
	 */
	List<AccountVO> queryAcount(AccountVO vo);

	/**
	 * 修改用户密码
	 * @param vo {id, password, newPassword}
	 * @return
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 
	 * @since 2011-11-16
	 */
	boolean changePassword(AccountVO vo);

	/**
	 * 验证用户密码
	 * @param vo {id, password}
	 * @return
	 * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 
	 * @since 2011-11-16
	 */
	public boolean validatePassword(AccountVO vo);

	public List<RoleVO> findAccountRoles(Long accountId);
}
